
# -*- coding: utf-8 -*-

from django.shortcuts import render_to_response
from comunidadcyt.gruposDeInvestigacion.models import GruposDeInvestigacion
from comunidadcyt.proyectos.models import Proyectos, SolicitudIngresoProyecto, HistorialProyecto
from comunidadcyt.proyectos.forms import ProyectosForm, FormSolicitudIngresoProyecto, FormHistorialProyecto
from django.core.exceptions import ObjectDoesNotExist
from django.utils import simplejson
from django.contrib.auth.models import User
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.template.context import RequestContext
from comunidadcyt.Publicaciones.models import Libros, Conferencias, Papers, Tesis, Revistas, ReportesTecnicos
from comunidadcyt.util.permisos import  puedeCrearProyecto, puedeEditarProyecto, puedeCrearProyectoEnListaGrupoInv, \
                                    puedeAprobarIngresosProyectos, puedeAprobarIngresoProyectoEspecifico
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import  ParagraphStyle as PS
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.platypus import Table, TableStyle, Image
from reportlab.lib.units import inch
from reportlab.lib import colors
from reportlab.platypus import Spacer
import unicodedata
import os
import datetime

def obtenerProyecto(request,object_id):
    objectoProyecto = None
    if int(object_id):
        try:
            objectoProyecto = Proyectos.objects.get(id=object_id)
        except ObjectDoesNotExist:
            objectoProyecto = None
    return objectoProyecto

def obtenerHistorialProyecto(request, object_id):
    if int(object_id):
        try:
            histProy = HistorialProyecto.objects.get(id=object_id)
        except ObjectDoesNotExist:
            return None
    else:
        return None
    return histProy

def obtenerListaGruposInv(request, listaIdGrupos):
    listaGrupos = []
    for idgrupo in listaIdGrupos:
        try:
           grupo = GruposDeInvestigacion.objects.get(id=int(idgrupo))
           listaGrupos.append(grupo)
        except ObjectDoesNotExist:
            pass
    return listaGrupos

def estaEnGrupo(user, grupo):
    if user and grupo:
        for miembro in grupo.Miembros.all():
            if miembro.id == user.id:
                return True
    return False

def estaEnProyecto(user, proyecto):
    if user and proyecto:
        for miembro in proyecto.Miembros.all():
            if miembro.id == user.id:
                return True
    return False

def obtenerSolicitud(request, object_id):
    solic = None
    if int(object_id):
        try:
            solic = SolicitudIngresoProyecto.objects.get(id=object_id)
        except ObjectDoesNotExist:
            solic = None
    return solic

def inicio(request):
    request.breadcrumbs('Proyectos',request.path)
    return render_to_response(
        'proyecto/listarProyectos.html',
        {
            'proyectos': Proyectos.objects.all(),
            'puedeCrear': puedeCrearProyecto(request.user),
            'puedeAprobar': puedeAprobarIngresosProyectos(request.user)
        },
        context_instance = RequestContext(request)
    )

def ver(request, object_id):
    proyecto = obtenerProyecto(request, object_id)
    if not proyecto:
        return render_to_response('error.html',{'error':'No existe el objecto proyecto', 'archivo': 'view de proyectos', 'linea': 'linea 21'})

    request.breadcrumbs([('Proyectos',reverse(inicio)),('Ver ' + proyecto.Nombre_proyecto, request.path)])
    return render_to_response(
        'proyecto/detalles.html',
        {'Proyecto': proyecto, 'puedeEditar': puedeEditarProyecto(request.user, proyecto)},
        context_instance = RequestContext(request)
    )

def solicitar_ingreso(request):
    if request.method == "GET":
        request.breadcrumbs([('Proyectos de Investigacion',reverse(inicio)),('Solicitar Ingreso',request.path)])

        return render_to_response(
            'proyecto/solicitar_ingreso.html',
            {'form': FormSolicitudIngresoProyecto(request.user)},
            context_instance = RequestContext(request)
        )
    elif request.method == "POST":
        form = FormSolicitudIngresoProyecto(request.user, request.POST, request.FILES)
        if not estaEnGrupo(request.user, obtenerProyecto(request, int(form.data['Proyecto']))):
            if form.is_valid():
                form.save()

                return render_to_response(
                    'proyecto/solicitar_ingreso_success.html',
                    {
                        'msg': 'Se ha enviado correctamente la solicitud de ingreso al proyectos seleccionado. Favor aguarde un tiempo prudencial para la aprobacion del mismo.',
                        'title': 'Solicitud de Ingreso',
                        'redirect_page': '/comunidadcyt/proyectos/',
                        'redirect_text': 'volver'
                    },
                    context_instance = RequestContext(request)
                )
            else:
                return render_to_response(
                    'error.html',
                    {'errors': form.errors,
                     'text_to_show':'Click aqui para reintentar',
                     'redirect_page':'/comunidadcyt/proyectos/solicitarIngreso/'},
                    context_instance = RequestContext(request)
                )
        else:
            return render_to_response(
                'error.html',
                {'errors': 'Ya eres miembro del proyecto de investigacion seleccionado.',
                 'text_to_show':'volver',
                 'redirect_page':'/comunidadcyt/proyectos/'},
                context_instance = RequestContext(request)
            )

    return HttpResponseRedirect(reverse(inicio))

def ver_solicitudes(request):
    if puedeAprobarIngresosProyectos(request.user):
        request.breadcrumbs([('Proyectos de Investigacion',reverse(inicio)),('Aprobar Ingresos',request.path)])
        return render_to_response(
            'proyecto/ver_solicitudes_ingreso.html',
            {'proyectos': SolicitudIngresoProyecto.objects.all()},
            context_instance = RequestContext(request)
        )
    return HttpResponseRedirect(reverse(inicio))

def aprobar_solicitud(request, object_id):
    solicitud = obtenerSolicitud(request, object_id)
    if solicitud == 'No existe la solicitud':
        return render_to_response('error.html',{'error':'No existe la solicitud seleccionada.', 'archivo': 'view de grupos de invetigacion', 'linea': 'linea 20'})

    if puedeAprobarIngresoProyectoEspecifico(request.user, solicitud.Proyecto):
        solicitud.Proyecto.Miembros.add(solicitud.Usuario)
        solicitud.delete()

        return render_to_response(
            'proyecto/solicitud_aprobada.html',
            {'title': 'Ingreso a Grupo de Investigacion',
             'msg': 'La solicitud de ingreso al grupo de investigacion ha sido aprobada correctamente.',
             'redirect_text': 'Volver',
             'redirect_page': '/comunidadcyt/proyectos/verSolicitudesIngreso/'},
            context_instance = RequestContext(request)
        )
    else:
        return render_to_response(
            'error.html',
            {'errors': 'No puedes aprobar la solicitud, pues no eres responsable del grupo.',
             'text_to_show':'Volver',
             'redirect_page':'/comunidadcyt/proyectos/verSolicitudesIngreso/'},
            context_instance = RequestContext(request)
        )

def crear(request):
    if puedeCrearProyecto(request.user):
        if request.method == "GET":
            request.breadcrumbs([('Proyectos',reverse(inicio)),('Crear',request.path)])

            return render_to_response(
                'proyecto/proyecto.html',
                {'form': ProyectosForm()},
                context_instance = RequestContext(request)
            )
        elif request.method == "POST":
            form = ProyectosForm(request.POST, request.FILES)
            if puedeCrearProyectoEnListaGrupoInv(request.user, obtenerListaGruposInv(request, request.POST.getlist('Grupos'))):
                if form.is_valid():
                    proyecto = form.save()

                    #now create the entrance historial of members
                    for idmember in request.POST.getlist('Miembros'):
                        try:
                            user = User.objects.get(id=int(idmember))
                            hist = HistorialProyecto()
                            hist.Usuario = user
                            hist.Proyecto = proyecto
                            hist.Fecha = datetime.datetime.now()
                            hist.Motivo = 'Miembro al crear el proyecto.'
                            hist.Tipo = 'Entrada'
                            hist.save()
                        except Exception:
                            pass
                else:
                    return render_to_response(
                        'error.html',
                        {'errors': form.errors,
                         'text_to_show':'Click aqui para reintentar',
                         'redirect_page':'/comunidadcyt/proyectos/crear/'},
                        context_instance = RequestContext(request)
                    )
            else:
                return render_to_response(
                    'error.html',
                    {'errors': 'No puedes seleccionar un grupo de investigacion del cual no eres responsable.',
                     'text_to_show':'Click aqui para reintentar',
                     'redirect_page':'/comunidadcyt/proyectos/crear/'},
                    context_instance = RequestContext(request)
                )

    return HttpResponseRedirect(reverse(inicio))

def getAddedMembers(prevList, actualList):
    listaNuevos = []
    for a in actualList:
        yaEstaba = False
        for p in prevList:
            if a.id == p.id:
                yaEstaba = True
                break

        if not yaEstaba:
            listaNuevos.append(a)

    return listaNuevos

def getDeletedMembers(prevList, actualList):
    listaBorrados = []
    for p in prevList:
        sigueEstando = False
        for a in actualList:
            if a.id == p.id:
                sigueEstando = True
                break

        if not sigueEstando:
            listaBorrados.append(p)

    return listaBorrados

def editar(request, object_id):
    proyecto = obtenerProyecto(request, object_id)
    if not proyecto:
        return render_to_response('error.html',{'error':'No existe el objecto proyecto', 'archivo': 'view de proyectos', 'linea': 'linea 21'})

    if puedeCrearProyecto(request.user):
        if request.method == "GET":
            request.breadcrumbs([('Proyectos',reverse(inicio)),('Editar',request.path)])

            return render_to_response(
                'proyecto/editar.html',
                {'form': ProyectosForm(instance=proyecto), 'object_id': object_id},
                context_instance = RequestContext(request)
            )
        elif request.method == "POST":
            form = ProyectosForm(request.POST, request.FILES, instance=proyecto)
            if puedeCrearProyectoEnListaGrupoInv(request.user, obtenerListaGruposInv(request, request.POST.getlist('Grupos'))):
                if form.is_valid():
                    prevMembers = [mem for  mem in proyecto.Miembros.all()]
                    proyNuevo = form.save()
                    actualMembers = [mem for  mem in proyNuevo.Miembros.all()]

                    #now create the entrance historial of members
                    for member in getAddedMembers(prevMembers, actualMembers):
                        try:
                            user = member
                            hist = HistorialProyecto()
                            hist.Usuario = user
                            hist.Proyecto = proyNuevo
                            hist.Fecha = datetime.datetime.now()
                            hist.Motivo = 'Miembro agregado al editar el proyecto.'
                            hist.Tipo = 'Entrada'
                            hist.save()
                        except Exception:
                            pass

                    #now create the deleted historial of members
                    for member in getDeletedMembers(prevMembers, actualMembers):
                        try:
                            user = member
                            hist = HistorialProyecto()
                            hist.Usuario = user
                            hist.Proyecto = proyNuevo
                            hist.Fecha = datetime.datetime.now()
                            hist.Motivo = 'Miembro sacado al editar el proyecto.'
                            hist.Tipo = 'Salida'
                            hist.save()
                        except Exception:
                            pass
                else:
                    return render_to_response(
                        'error.html',
                        {'errors': form.errors,
                         'text_to_show':'Click aqui para reintentar',
                         'redirect_page':'/comunidadcyt/proyectos/editar/%s' % str(object_id)},
                        context_instance = RequestContext(request)
                    )
            else:
                return render_to_response(
                    'error.html',
                    {'errors': 'No puedes seleccionar un grupo de investigacion del cual no eres responsable.',
                     'text_to_show':'Click aqui para reintentar',
                     'redirect_page':'/comunidadcyt/proyectos/editar/%s' % str(object_id)},
                    context_instance = RequestContext(request)
                )

    return HttpResponseRedirect(reverse(inicio))

def borrar(request, object_id):
    proyecto = obtenerProyecto(request, object_id)
    if not proyecto:
        return render_to_response('error.html',{'error':'No existe el objecto proyecto', 'archivo': 'view de proyectos', 'linea': 'linea 21'})

    request.breadcrumbs([('Proyectos',reverse(inicio)),('Borrar '+proyecto.Nombre_proyecto,request.path)])

    if puedeEditarProyecto(request.user, proyecto):
        if request.method == "GET":
            request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Borrar '+proyecto.Nombre_proyecto,request.path)])

            return render_to_response(
                'proyecto/confirm_delete.html',
                {'object_id': object_id},
                context_instance = RequestContext(request)
            )
        elif request.method == "POST":
            try:
                proyecto.delete()
            except:
                pass
    return HttpResponseRedirect(reverse(inicio))

def obtenerDeptos(proyecto):
    list_departamentos = []
    for grupo in proyecto.Grupos.all():
        if not list_departamentos.__contains__(grupo.Departamento):
            list_departamentos += [grupo.Departamento]
    return list_departamentos

def obtenerMiembros(proyecto):
    return proyecto.Miembros.all()

def listarpublicaciones(request, object_id=0):
    proyecto = obtenerProyecto(request, object_id)
    miembros = obtenerMiembros(proyecto)
    if not proyecto:
        return render_to_response('error.html',{'error':'No existe el objecto proyecto', 'archivo': 'view de proyectos', 'linea': 'linea 21'})

    request.breadcrumbs([('Proyectos',reverse(inicio)),('Listar Publicaciones de '+proyecto.Nombre_proyecto,request.path)])
    if miembros.__contains__(request.user):
        return render_to_response('proyecto/publicaciones.html', {'Proyecto': proyecto, 
                                                             'books': Libros.objects.filter(proyectos__Nombre_proyecto = proyecto.Nombre_proyecto),
                                                             'magazines': Revistas.objects.filter(proyectos__Nombre_proyecto = proyecto.Nombre_proyecto),
                                                             'tesis': Tesis.objects.filter(proyectos__Nombre_proyecto = proyecto.Nombre_proyecto),
                                                             'papers': Papers.objects.filter(proyectos__Nombre_proyecto = proyecto.Nombre_proyecto),
                                                             'reports': ReportesTecnicos.objects.filter(proyectos__Nombre_proyecto = proyecto.Nombre_proyecto), 
                                                             'conferences': Conferencias.objects.filter(proyectos__Nombre_proyecto = proyecto.Nombre_proyecto), 
                                                              'user': request.user}, context_instance=RequestContext(request))
    else:
        return render_to_response('proyecto/publicaciones.html', {'Proyecto': proyecto, 
                                                             'books': Libros.objects.filter(proyectos__Nombre_proyecto = proyecto.Nombre_proyecto,aprobado=True),
                                                             'magazines': Revistas.objects.filter(proyectos__Nombre_proyecto = proyecto.Nombre_proyecto,aprobado=True),
                                                             'tesis': Tesis.objects.filter(proyectos__Nombre_proyecto = proyecto.Nombre_proyecto,aprobado=True),
                                                             'papers': Papers.objects.filter(proyectos__Nombre_proyecto = proyecto.Nombre_proyecto,aprobado=True),
                                                             'reports': ReportesTecnicos.objects.filter(proyectos__Nombre_proyecto = proyecto.Nombre_proyecto,aprobado=True), 
                                                             'conferences': Conferencias.objects.filter(proyectos__Nombre_proyecto = proyecto.Nombre_proyecto,aprobado=True), 
                                                              'user': request.user}, context_instance=RequestContext(request))

def editarHistorial(request, object_id=0):
    hist = obtenerHistorialProyecto(request, object_id)
    if hist is None:
        return render_to_response('error.html',{'error':'No existe el historial solicitado.', 'archivo': 'view de grupos de invetigacion', 'linea': 'linea 20'})

    if puedeEditarProyecto(request.user, hist.Proyecto):
        if request.method == "GET":
            request.breadcrumbs([('Grupos de Investigacion',reverse(inicio)),('Editar Historial',request.path)])

            return render_to_response(
                'proyecto/edit_historial.html',
                {'form': FormHistorialProyecto(hist, instance=hist), 'object_id': hist.id},
                context_instance = RequestContext(request)
            )
        elif request.method == "POST":
            form = FormHistorialProyecto(hist, request.POST, request.FILES, instance=hist)
            if puedeEditarProyecto(request.user, hist.Proyecto):
                if form.is_valid():
                    hist = form.save()
                    return HttpResponseRedirect('/comunidadcyt/proyectos/historial/%s' % str(hist.Proyecto.id))
                else:
                    return render_to_response(
                        'error.html',
                        {'errors': form.errors,
                         'text_to_show':'Click aqui para reintentar',
                         'redirect_page':'/comunidadcyt/proyectos/editarHistorial/%s' % str(object_id)},
                        context_instance = RequestContext(request)
                    )
            else:
                return render_to_response(
                    'error.html',
                    {'errors': 'No tienens permisos para modificar el historial del proyecto.',
                     'text_to_show':'Click aqui para reintentar',
                     'redirect_page':'/comunidadcyt/proyectos/editarHistorial/%s' % str(object_id)},
                    context_instance = RequestContext(request)
                )

    return HttpResponseRedirect(reverse(inicio))

def borrarHistorial(request, object_id=0):
    hist = obtenerHistorialProyecto(request, object_id)
    if hist is None:
        return render_to_response('error.html',{'error':'No existe el historial solicitado.', 'archivo': 'view de grupos de invetigacion', 'linea': 'linea 20'})

    if puedeEditarProyecto(request.user, hist.Proyecto):
        if request.method == "GET":
            request.breadcrumbs([('Proyecto',reverse(inicio)),('Borrar Historial',request.path)])

            return render_to_response(
                'proyecto/confirm_delete_historial.html',
                {'object_id': object_id},
                context_instance = RequestContext(request)
            )
        elif request.method == "POST":
            try:
                hist.delete()
            except:
                pass
            return HttpResponseRedirect('/comunidadcyt/proyectos/historial/%s' % str(hist.Proyecto.id))
    return HttpResponseRedirect(reverse(inicio))

def historial(request, object_id=0):
    proyecto = obtenerProyecto(request, object_id)
    if not proyecto:
        return render_to_response('error.html',{'error':'No existe el objecto proyecto', 'archivo': 'view de proyectos', 'linea': 'linea 21'})

    listaHistorial = HistorialProyecto.objects.filter(Proyecto=proyecto).all()

    request.breadcrumbs([('Proyectos de Investigacion',reverse(inicio)),('Historial de '+proyecto.Nombre_proyecto,request.path)])
    return render_to_response('proyecto/historial.html', {'Proyecto': proyecto, 'listaHistorial': listaHistorial, 'user': request.user}, context_instance=RequestContext(request))

def listarmiembros(request, object_id=0):
    proyecto = obtenerProyecto(request, object_id)
    if not proyecto:
        return render_to_response('error.html',{'error':'No existe el objecto proyecto', 'archivo': 'view de proyectos', 'linea': 'linea 21'})

    request.breadcrumbs([('Proyectos',reverse(inicio)),('Listar Miembros de '+proyecto.Nombre_proyecto,request.path)])
    return render_to_response('proyecto/miembros.html', {'Proyecto': proyecto, 'list_miembros': proyecto.Miembros.all(), 'user': request.user}, context_instance=RequestContext(request))

def listardeptos(request, object_id=0):
    proyecto = obtenerProyecto(request, object_id)
    if not proyecto:
        return render_to_response('error.html',{'error':'No existe el objecto proyecto', 'archivo': 'view de proyectos', 'linea': 'linea 21'})

    request.breadcrumbs([('Proyectos',reverse(inicio)),('Listar Departamentos de '+proyecto.Nombre_proyecto,request.path)])
    return render_to_response('proyecto/deptos.html', {'Proyecto': proyecto, 'list_deptos': obtenerDeptos(proyecto), 'user': request.user}, context_instance=RequestContext(request))

def listargrupos(request, object_id=0):
    proyecto = obtenerProyecto(request, object_id)
    if not proyecto:
        return render_to_response('error.html',{'error':'No existe el objecto proyecto', 'archivo': 'view de proyectos', 'linea': 'linea 21'})

    request.breadcrumbs([('Proyectos',reverse(inicio)),('Listar Grupos de '+proyecto.Nombre_proyecto,request.path)])
    return render_to_response('proyecto/grupos.html', {'Proyecto': proyecto, 'list_grupos': proyecto.Grupos.all(), 'user': request.user}, context_instance=RequestContext(request))

def listarlineas(request, object_id=0):
    proyecto = obtenerProyecto(request, object_id)
    if not proyecto:
        return render_to_response('error.html',{'error':'No existe el objecto proyecto', 'archivo': 'view de proyectos', 'linea': 'linea 21'})

    request.breadcrumbs([('Proyectos',reverse(inicio)),('Listar Lineas de '+proyecto.Nombre_proyecto,request.path)])
    return render_to_response('proyecto/lineas.html', {'Proyecto': proyecto, 'list_lineas': proyecto.Lineas.all(), 'user': request.user}, context_instance=RequestContext(request))

def listarpartners(request, object_id=0):
    proyecto = obtenerProyecto(request, object_id)
    if not proyecto:
        return render_to_response('error.html',{'error':'No existe el objecto proyecto', 'archivo': 'view de proyectos', 'linea': 'linea 21'})

    request.breadcrumbs([('Proyectos',reverse(inicio)),('Listar Proyectos de '+proyecto.Nombre_proyecto,request.path)])
    return render_to_response('proyecto/partners.html', {'Proyecto': proyecto, 'list_partners': proyecto.Partners.all(), 'user': request.user}, context_instance=RequestContext(request))

def misProyectos(request):
    object_list = Proyectos.objects.filter(Grupos__Miembros=request.user,Aprobado=True).distinct()
    return render_to_response('proyecto/listarProyectos.html',{'object_list': object_list, 'user': request.user})

def xhr_all_projects_view(request,key_xhr):
    response_dict = {}
    rl = []
    pl = Proyectos.objects.all()
    for p in pl:
        rl.append(p.Nombre_proyecto)
    response_dict.update({'list':rl})
    return HttpResponse(simplejson.dumps(response_dict),mimetype='application/javascript')

def generarCV(request, object_id):
    proyecto = obtenerProyecto(request, object_id)
    if not proyecto:
        return render_to_response('error.html',{'errors':'No existe el objecto proyecto', 'archivo': 'view de proyectos', 'linea': 'linea 21'})
    
    list_grupos = list(proyecto.Grupos.all())
    list_lineas = list(proyecto.Lineas.all())
    list_departamentos = list(obtenerDeptos(proyecto))
    list_miembros = list(obtenerMiembros(proyecto))
    list_partners = list(proyecto.Partners.all())
    
    
    nombre = "CV_" + unicodedata.normalize('NFKD', proyecto.Nombre_proyecto).encode('ascii','ignore').replace(" ", "")

    response = HttpResponse(mimetype='application/pdf')
    response['Content-Disposition'] = 'inline; filename=%s' % nombre

    doc = SimpleDocTemplate(response, pagesize=A4, title=nombre, author="LED UCA")

    story = []

    h1 = PS (name = 'Heading 1', fontSize = 16, leading = 16, alignment = 1, textColor = colors.darkgreen)
    h2 = PS (name = 'Heading 2', fontSize = 12, leading = 14, alignment = 0, textColor = colors.blue)
    h3 = PS (name = 'Heading 3', fontSize = 12, leading = 14, alignment = 0)
    body_style = PS (name = 'Body', fontSize = 10, leading = 12)
    table_style = TableStyle ([ ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('BOX', (0,0), (-1,-1), 0.25, colors.white) ])

    #--------------------------------------------------------------------------------------------
    if not proyecto.Imagen.url.endswith('static/images/default.png'):
        path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + proyecto.Imagen.url.replace('/',os.sep)
        img = Image(path, width=100, height=100)
        img.hAlign = 'CENTER'
        story.append(img)
        story.append(Spacer(0,12))

    texto1 = proyecto.Nombre_proyecto
    P = Paragraph(texto1, h1)
    story.append(P)
    story.append(Spacer(0,12))
    story.append(Spacer(0,12))

    if proyecto.Fuente_de_financiamiento and proyecto.Fuente_de_financiamiento != "":
        story.append(Spacer(0,6))
        data = [[Paragraph("Fuente de financiamiento:", h2), Paragraph(proyecto.Fuente_de_financiamiento, h3)]]
        t = Table(data)
        table_style.add('GRID',(0,0),(2,1),1,colors.white)
        t.setStyle(table_style)
        t._argW[0]=2.1*inch
        story.append(t)
    if proyecto.Capital and proyecto.Capital != "":
        story.append(Spacer(0,6))
        data = [[Paragraph("Capital:", h2), Paragraph(unicode(proyecto.Capital) + ' Gs.', h3)]]
        t = Table(data)
        table_style.add('GRID',(0,0),(2,1),1,colors.white)
        t.setStyle(table_style)
        t._argW[0]=0.7*inch
        story.append(t)
    if proyecto.Colaboradores and proyecto.Colaboradores != "":
        story.append(Spacer(0,6))
        data = [[Paragraph("Colaboradores:", h2), Paragraph(proyecto.Colaboradores, h3)]]
        t = Table(data)
        table_style.add('GRID',(0,0),(2,1),1,colors.white)
        t.setStyle(table_style)
        t._argW[0]=1.3*inch
        story.append(t)
    if proyecto.Fecha_inicio:
        story.append(Spacer(0,6))
        data = [[Paragraph("Fecha de iniciación:", h2), Paragraph(str(proyecto.Fecha_inicio), h3)]]
        t = Table(data)
        table_style.add('GRID',(0,0),(2,1),1,colors.white)
        t.setStyle(table_style)
        t._argW[0]=1.7*inch
        story.append(t)
    if proyecto.Fecha_finalizacion:
        story.append(Spacer(0,6))
        data = [[Paragraph("Fecha de finalización:", h2), Paragraph(str(proyecto.Fecha_finalizacion), h3)]]
        t = Table(data)
        table_style.add('GRID',(0,0),(2,1),1,colors.white)
        t.setStyle(table_style)
        t._argW[0]=1.8*inch
        story.append(t)
    if proyecto.PaginaWeb and proyecto.PaginaWeb != "":
        story.append(Spacer(0,6))
        data = [[Paragraph("Sitio Web:", h2), Paragraph(proyecto.PaginaWeb, h3)]]
        t = Table(data)
        table_style.add('GRID',(0,0),(2,1),1,colors.white)
        t.setStyle(table_style)
        t._argW[0]=1.0*inch
        story.append(t)
    if proyecto.Descripcion_proyecto and proyecto.Descripcion_proyecto != "":
        story.append(Spacer(0,6))
        data = [[Paragraph("Descripción:", h2), Paragraph(proyecto.Descripcion_proyecto, h3)]]
        t = Table(data)
        table_style.add('GRID',(0,0),(2,1),1,colors.white)
        t.setStyle(table_style)
        t._argW[0]=1.1*inch
        story.append(t)
    story.append(Spacer(0,12))
    story.append(Spacer(0,12))
    #--------------------------------------------------------------------------------------------

    P = Paragraph("Responsables del proyecto:", h2)
    story.append(P)
    story.append(Spacer(0,12))
    data = []
    for p in proyecto.Responsables.all():
        respTitle = ''
        if p.get_profile().titulo and p.get_profile().titulo != '---':
            respTitle = p.get_profile().titulo + ' '
        path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + p.get_profile().foto.url.replace('/',os.sep)
        img = Image(path, width=40, height=40)
        data.append([
            img,
            [Paragraph(respTitle + p.first_name + ' ' + p.last_name, h3), Paragraph(p.email, body_style)]
        ])

    t = Table(data)
    table_style_1 = table_style
    table_style_1.add('GRID',(0,0),(2,len(data)),1,colors.white)
    t.setStyle(table_style_1)
    t._argW[0]=0.7*inch
    story.append(t)
    #--------------------------------------------------------------------------------------------
    if list_miembros:
        story.append(Spacer(0,12))
        P = Paragraph("Miembros del proyecto:", h2)
        story.append(P)
        story.append(Spacer(0,12))
        data = []
        for p in list_miembros:
            respTitle = ''
            if p.get_profile().titulo and p.get_profile().titulo != '---':
                respTitle = p.get_profile().titulo + ' '
            path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + p.get_profile().foto.url.replace('/',os.sep)
            img = Image(path, width=40, height=40)
            data.append([
                img,
                [Paragraph(respTitle + p.first_name + ' ' + p.last_name, h3), Paragraph(p.email, body_style)]
            ])

    t = Table(data)
    table_style_1 = table_style
    table_style_1.add('GRID',(0,0),(2,list_miembros.__len__()),1,colors.white)
    t.setStyle(table_style_1)
    t._argW[0]=0.7*inch
    story.append(t)
    #--------------------------------------------------------------------------------------------
    if list_grupos:
        story.append(Spacer(0,12))
        P = Paragraph("Grupos de investigación del proyecto:", h2)
        story.append(P)
        story.append(Spacer(0,12))
        data = []
        for p in list_grupos:
            path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + p.Imagen.url.replace('/',os.sep)
            img = Image(path, width=40, height=40)
            data.append([img, [Paragraph(p.Nombre_grupo,h3), Paragraph(p.Descripcion_grupo,body_style)]])

        t = Table(data)
        table_style_1 = table_style
        table_style_1.add('GRID',(0,0),(2,list_grupos.__len__()),1, colors.white)
        t.setStyle(table_style_1)
        t._argW[0]=0.7*inch
        story.append(t)
    #--------------------------------------------------------------------------------------------
    if list_lineas:
        story.append(Spacer(0,12))
        P = Paragraph("Líneas de investigación del proyecto:", h2)
        story.append(P)
        story.append(Spacer(0,12))
        data = []
        for p in list_lineas:
            path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + p.Imagen.url.replace('/',os.sep)
            img = Image(path, width=40, height=40)
            data.append([img, [Paragraph(p.Nombre_linea,h3), Paragraph(p.Descripcion_linea,body_style)]])

        t = Table(data)
        table_style_1 = table_style
        table_style_1.add('GRID',(0,0),(2,list_lineas.__len__()),1, colors.white)
        t.setStyle(table_style_1)
        t._argW[0]=0.7*inch
        story.append(t)
    #--------------------------------------------------------------------------------------------
    if list_departamentos:
        story.append(Spacer(0,12))
        P = Paragraph("Departamentos del proyecto:", h2)
        story.append(P)
        story.append(Spacer(0,12))
        data = []
        for p in list_departamentos:
            path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + p.Imagen.url.replace('/',os.sep)
            img = Image(path, width=40, height=40)
            data.append([img, [Paragraph(p.Nombre_departamento,h3), Paragraph(p.Descripcion_dpto,body_style)]])

        t = Table(data)
        table_style_1 = table_style
        table_style_1.add('GRID',(0,0),(2,list_departamentos.__len__()),1, colors.white)
        t.setStyle(table_style_1)
        t._argW[0]=0.7*inch
        story.append(t)
    #--------------------------------------------------------------------------------------------
    if list_partners:
        story.append(Spacer(0,12))
        P = Paragraph("Partners del proyecto:", h2)
        story.append(P)
        story.append(Spacer(0,12))
        data = []
        for p in list_partners:
            path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + p.Imagen.url.replace('/',os.sep)
            img = Image(path, width=40, height=40)
            data.append([img, [Paragraph(p.Nombre_partner,h3), Paragraph(p.Descripcion_partner,body_style)]])

        t = Table(data)
        table_style_1 = table_style
        table_style_1.add('GRID',(0,0),(2,list_partners.__len__()),1, colors.white)
        t.setStyle(table_style_1)
        t._argW[0]=0.7*inch
        story.append(t)
        story.append(Spacer(0,12))
    #--------------------------------------------------------------------------------------------
    
    doc.build(story)

    return response   
